#include <iostream>
using std::cout;
using std::endl;
using std::ostream;
//嵌套类：由外部类和内部类组成
//外部类
//关于此时的Point属于内部类，但是如果我们写在外部，那么其实没有问题
//那么为什么一定要写在内部呢？？？为了私有，只给外部类使用，
//其他使用不到
class Line{
public:
    Line(int x1, int y1, int x2, int y2)
    :_pt1(x1, y1)
    ,_pt2(x2, y2)
    {
        cout << "Line(int,int,int,int)" << endl;
    }

    void printLine(){
        _pt1.print();
        cout << "--------->";
        _pt2.print();
        cout << endl;
    }
    friend ostream & operator<<(ostream & os, const Line & rhs);
    //位于Line的内部
    //内部类
private:
    class Point{
    public:
        Point(int x, int y)
        :_x(x)
        ,_y(y)
        {
            cout << "Point(int,int)" << endl;
        }
        void print(){
            cout << "(" << _x << "," << _y << ")";
        }
        friend ostream & operator<<(ostream & os, const Line::Point & rhs);
    private:
        int _x;
        int _y;
    };
    friend ostream & operator<<(ostream & os, const Line::Point & rhs);


private:
    //对象数据成员，需要调用构造函数来完成初始化
    Point _pt1;
    Point _pt2;


};
void test(){
    Line line(1, 2, 3, 4);
    line.printLine();

    //如果此时希望单独去使用Point，那么有些麻烦
    //Point pt(1, 2);error
    //Line::Point pt(1, 2);//ok
}
//该函数需要访问Point的私有数据成员_x  _y
//所以该函数需要设置为Point的友元
//Point位于Line的私有区域，所以外部是不可以直接访问到的
//该函数首先需要访问到Line的私有内部类，才可以进行后续的操作
//该函数需要设置为Line的友元
ostream & operator<<(ostream & os, const Line::Point & rhs){
    os << "(" << rhs._x << "," << rhs._y << ")";
    return os;
}
//输出流运算符的重载
//这个函数需要访问Line的私有数据成员_pt1 _pt2
//所以该函数需要设置为Line的友元
ostream & operator<<(ostream & os, const Line & rhs){
    os << rhs._pt1;
    os << "------->";
    os << rhs._pt2;
    os << endl;
    return os;
}


void test2(){
    //使用输出流运算符对于line和point进行输出
    Line line(1, 2, 3, 4);
    cout << line << endl;
    Line::Point pt(1, 2);
    cout << pt << endl;
}

int main()
{
    test2();
    return 0;
}

